<?php
class Cuotas extends MY_Controller {

	// Datos para pasar a las vistas
	var $pageTitle = 'Prevet :: Afiliados :: Cuotas';
	var $nombre_entidad = 'Cuota';		// Cadena utilizada para los títulos de las páginas

	// Vistas manejadas por el controlador
	var $CARPETA_VISTAS = 'afiliados/'; 	// Directorio donde están contenidas las vistas gestionadas por el controlador
	var $pagina_editar; 					// Nombre de la vista de edición
	var $pagina_ver;						// Nombre de la vista para mostrar todos
	var $pagina_reporte_deudas;
	var $pagina_reporte_cobros;


	public function __construct()
    {
    	parent::__construct();

    	$this->pagina_editar = $this->CARPETA_VISTAS . 'cuota_edit_view';
    	$this->pagina_ver = $this->CARPETA_VISTAS . 'cuota_ver_todos_view';
    	$this->pagina_reporte_deudas .= 'reportes/cuota_deudas_report_view';
    	$this->pagina_reporte_cobros .= 'reportes/cuota_cobros_report_view';
	}
	

	public function registrar_pago($id_hist_plan)
	{
		$dataView['title'] = 'Registrar pago de ' . $this->nombre_entidad . 's';

		$dataView['historial_plan_id'] = $id_hist_plan;

		// Se buscan todas las cuotas pendientes de pago del Historial Plan actual
		$obj_cuota = new Cuota();
		$obj_cuota->where('historial_plan_id', $id_hist_plan);
		$obj_cuota->where('fecha_cobro', NULL);
		$dataView['obj'.$this->nombre_entidad] = $obj_cuota->get_iterated();

		parent::_loadViews($this->pagina_editar, $dataView, FALSE);
	}

	public function guardar()
	{
		$dataView['title'] = 'Guardar ' . $this->nombre_entidad . 's';
		$dataView['error'] = '';

		$id_hist_plan = $this->input->post('txt_id_hist_plan');

		// Se manejan transacciones para interactuar con la BD
		$obj_cuota = new Cuota();
		$obj_cuota->trans_begin();

		/* No se sabe cuántas cuotas pagó */
		$lista_cuotas = $this->input->post('chk_cuotas');
		if(!is_array($lista_cuotas)) $lista_cuotas = array(); # Para evitar errores en el foreach
		foreach ($lista_cuotas as $id_cuota) {
			// Se obtienen los datos del formulario para poblar el modelo
			$obj_cuota->where('id', $id_cuota);
			$obj_cuota->get();

			$obj_cuota->importe = $this->input->post('txt_importe_' . $id_cuota);
			$obj_cuota->fecha_cobro = $this->input->post('txt_fecha_cobro_' . $id_cuota);
			
			$operacion_exitosa = $obj_cuota->save();
		}
		
		if ($obj_cuota->trans_status() === FALSE) // Se chequea el estado de la transacción
		{
		    $obj_cuota->trans_rollback(); // Si la transacción falló, hago un rollback
		}
		else
		{
		    $obj_cuota->trans_commit(); // Transacción exitosa, realizo el commit
		}

		$dataView['error'] = $obj_cuota->error->string; // Almaceno todos los errores que hubieran podido ocurrir
		
		if($id_hist_plan != 0) redirect('historiales_planes/ver/' . $id_hist_plan);
		else {
			$dataView['error'] = 'No se ha especificado toda la información requerida para registrar el pago de las cuotas.';
			$dataView['path_volver'] = 'afiliados/ver_todos';
			parent::_loadViews($this->template->getErrorMessageView(), $dataView);
		}
	}

	public function ver_todos($id_hist_plan)
	{
		$dataView['title'] = 'Listado de ' . $this->nombre_entidad . 's';

		// Creo un objeto del modelo, para poblarlo con los datos que necesito mostrar
		$obj_cuota = new Cuota();
		$obj_cuota->where('historial_plan_id', $id_hist_plan);
		$obj_cuota->get_iterated(); // Obtengo todos los elementos

		$dataView['listado'] = $obj_cuota;
		parent::_loadViews($this->pagina_ver, $dataView);
	}

	private function _aplicarFiltros($tipo_informe = '')
	{
		// Listado de afiliados
		$obj_cuota = new Cuota();

		$num_afiliado = is_numeric($this->input->post('filtro_id_afiliado')) ? $this->input->post('filtro_id_afiliado') : 0;
		if($num_afiliado != 0) { $obj_cuota->where_related_historial_plan('afiliado_id', $num_afiliado); }

		$periodo_desde = is_numeric($this->input->post('filtro_periodo_desde')) ? $this->input->post('filtro_periodo_desde') : 0;
		if($periodo_desde != 0) { $obj_cuota->where('periodo >=', $periodo_desde); }

		$periodo_hasta = is_numeric($this->input->post('filtro_periodo_hasta')) ? $this->input->post('filtro_periodo_hasta') : 0;
		if($periodo_hasta != 0) { $obj_cuota->where('periodo <=', $periodo_hasta); }

		$cobro_desde = trim($this->input->post('filtro_cobro_desde'));
		if($cobro_desde != '') { $obj_cuota->where('fecha_cobro >=', $this->util_fechas->prepararFecha($cobro_desde)); }

		$cobro_hasta = trim($this->input->post('filtro_cobro_hasta'));
		if($cobro_hasta != '') { $obj_cuota->where('fecha_cobro <=', $this->util_fechas->prepararFecha($cobro_hasta)); }		
		
		if($tipo_informe != '') {
			if($tipo_informe == 'Cobros') $obj_cuota->where('fecha_cobro !=', 'NULL');
			else $obj_cuota->where('fecha_cobro', NULL);
		}

		$obj_cuota->order_by('id', 'desc');

		return $obj_cuota->get_iterated();
	}

	public function informe_deudas($dataView = array())
	{
		$dataView['title'] = 'Generar Resumen de Deudas';
		parent::_loadViews($this->pagina_reporte_deudas, $dataView);
	}

	public function informe_cobros($dataView = array())
	{
		$dataView['title'] = 'Generar Resumen de Cobros';
		parent::_loadViews($this->pagina_reporte_cobros, $dataView);
	}

	public function generar_reporte_deudas()
	{
		$this->_generar_reporte('Deudas');
	}

	public function generar_reporte_cobros()
	{
		$this->_generar_reporte('Cobros');
	}

	private function _generar_reporte($tipo_informe)
	{	
		$dataView['title'] = 'Generar Resumen de ' . $tipo_informe;
		$titulo = 'Listado de ' . $tipo_informe;
		$dataView['titulo'] = $titulo;

		// Obtengo el listado a mostrar
		$listado = $this->_aplicarFiltros($tipo_informe);
		if($listado->exists()) 
		{
			$this->load->library('to_excel');
			$objPHPExcel = $this->to_excel->getExcelObject($titulo);
			
			// Defino estilos de los títulos
			$objPHPExcel->getActiveSheet()->getStyle('A3:G3')->applyFromArray($this->to_excel->getHeadersStyle());

			$objPHPExcel->setActiveSheetIndex(0)->setCellValue('A1', $titulo);
			$objPHPExcel->setActiveSheetIndex(0)->setCellValue('G1', date('d/m/Y h:m'));
			$objPHPExcel->getActiveSheet()->mergeCells('A1:F1'); // Título
			$objPHPExcel->getActiveSheet()->mergeCells('G1:H1'); // Fecha de obtención del reporte
			$objPHPExcel->getActiveSheet()->getStyle('A1:F1')->applyFromArray($this->to_excel->getTitleStyle());

			// Arranco de la fila 3 ya que dejo una en blanco
			$fila_inicio = 3;
			$objPHPExcel->setActiveSheetIndex(0)->setCellValue('A'.$fila_inicio, 'N° Cuota');
			$objPHPExcel->setActiveSheetIndex(0)->setCellValue('B'.$fila_inicio, 'Período');
			$objPHPExcel->setActiveSheetIndex(0)->setCellValue('C'.$fila_inicio, 'N° afiliado');
			$objPHPExcel->setActiveSheetIndex(0)->setCellValue('D'.$fila_inicio, 'Plan');
			$objPHPExcel->setActiveSheetIndex(0)->setCellValue('E'.$fila_inicio, 'Titular');
			$objPHPExcel->setActiveSheetIndex(0)->setCellValue('F'.$fila_inicio, 'Importe');
			if($tipo_informe == 'Cobros') $objPHPExcel->setActiveSheetIndex(0)->setCellValue('G'.$fila_inicio, 'Fecha Cobro');

			$array_columnas = array('A', 'B', 'C', 'D', 'E', 'F');
			if($tipo_informe == 'Cobros') $array_columnas[] = 'G';
			foreach($array_columnas as $col)
				 $objPHPExcel->getActiveSheet()->getColumnDimension($col)->setAutoSize(true);

			// Renombrar Hoja
			$objPHPExcel->getActiveSheet()->setTitle($titulo);

			// Establecer la hoja activa, para que cuando se abra el documento se muestre primero.
			$objPHPExcel->setActiveSheetIndex(0);

			$fila = $fila_inicio;
			foreach ($listado as $cuota) {
				$fila++;

				$cuota->historial_plan->get();
				$cuota->historial_plan->plan->get();
				$cuota->historial_plan->plan->especie->get();
				$cuota->historial_plan->afiliado->get();
				$cuota->historial_plan->afiliado->duenio->get();
				
				$objPHPExcel->setActiveSheetIndex(0)->setCellValue('A'.$fila, $cuota->id);
				$objPHPExcel->setActiveSheetIndex(0)->setCellValue('B'.$fila, $cuota->periodo);
				$objPHPExcel->setActiveSheetIndex(0)->setCellValue('C'.$fila, $cuota->historial_plan->afiliado_id);
				$objPHPExcel->setActiveSheetIndex(0)->setCellValue('D'.$fila, $cuota->historial_plan->plan->nombre . ' (' . $cuota->historial_plan->plan->especie->nombre . ')');
				$objPHPExcel->setActiveSheetIndex(0)->setCellValue('E'.$fila, $cuota->historial_plan->afiliado->duenio->apellido . ', ' .$cuota->historial_plan->afiliado->duenio->nombre);
				$objPHPExcel->setActiveSheetIndex(0)->setCellValue('F'.$fila, $cuota->importe);
				//if($tipo_informe == 'Cobros') 
					$objPHPExcel->setActiveSheetIndex(0)->setCellValue('G'.$fila, $cuota->fecha_cobro);
			}

			$dataView['objWriter'] = $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
			$dataView['objPHPExcel'] = $objPHPExcel;

			$this->load->view('reportes/report_view', $dataView);
		}
		else { 
			$dataView['error'] = 'La consulta no produjo resultados.';
			if($tipo_informe == 'Cobros') $this->informe_cobros($dataView);
			else $this->informe_deudas($dataView);
		}
	}
}